package sistkaraoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import sistkaraoke.excepcion.DAOExcepcion;
import sistkaraoke.modelo.Cliente;
import sistkaraoke.modelo.ICliente;
import sistkaraoke.modelo.ILocal;
import sistkaraoke.modelo.IReserva;
import sistkaraoke.modelo.ISala;
import sistkaraoke.modelo.Local;
import sistkaraoke.modelo.Reserva;
import sistkaraoke.modelo.Sala;
import sistkaraoke.util.ConexionBD;

public class ReservaDAO extends BaseDAO implements IReservaDAO {


	public int insertar(IReserva objReserva) throws DAOExcepcion {
		String query = "Exec KARAOKE.USP_ADD_RESERVA ?,?,?;";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int i = 0;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objReserva.getDescripcion());
			stmt.setInt(2, objReserva.getSala().getId());
			stmt.setInt(3, objReserva.getCliente().getIdcliente());
			
			i = stmt.executeUpdate();
			
			if (i != 1) {
				throw new SQLException("Error al Insertar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return i;
	}
	

	public int actualizar(IReserva objReserva) throws DAOExcepcion {
		String query = "Exec KARAOKE.USP_UPD_RESERVA ?,?,?,?;";
		Connection con = null;
		PreparedStatement stmt = null;
		int i = 0;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, objReserva.getId());
			stmt.setString(2, objReserva.getDescripcion());
			stmt.setInt(3, objReserva.getSala().getId());
			stmt.setInt(4, objReserva.getCliente().getIdcliente());
		
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("Error al Actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}
	
	
	
	public int eliminar(int idReserva) throws DAOExcepcion {
		String query = "EXEC KARAOKE.USP_DEL_RESERVA ?;";
		Connection con = null;
		PreparedStatement stmt = null;
		int i = 0;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idReserva);
			
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("Error al Eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}
	
	
	public Collection<IReserva> buscar(IReserva objReserva) throws DAOExcepcion {
		String query = "EXEC KARAOKE.USP_GET_RESERVA ?,?,?;";
		Collection<IReserva> lista = new ArrayList<IReserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objReserva.getDescripcion());
			stmt.setInt(2, objReserva.getSala().getId());
			stmt.setInt(3, objReserva.getCliente().getIdcliente());
			
			rs = stmt.executeQuery();
			
			IReserva vlReserva=null;
			ISala vlSala = null;
			ICliente vlCliente =null;
			
			while (rs.next()) {
				
				vlReserva= new Reserva();
				vlReserva.setId(rs.getInt("idreserva"));
				vlReserva.setFecha(rs.getString("fecha"));
				vlReserva.setDescripcion(rs.getString("descripcion"));
								
				vlSala = new Sala();
				vlSala.setId(rs.getInt("idsala"));
				vlSala.setNombre(rs.getString("nombreSala"));
				vlReserva.setSala(vlSala);
				
				vlCliente = new Cliente();
				vlCliente.setIdcliente(rs.getInt("idcliente"));
				vlCliente.setDni(rs.getInt("dni"));
				vlReserva.setCliente(vlCliente);
				
				lista.add(vlReserva);
			}
		} catch (SQLException e) {			
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}		
		return lista;
	}	

	
}
